home *** CD-ROM | disk | FTP | other *** search
- /*
- File: ShapePartsDrones.c
-
- Contains: QuickDraw GX to PostScript conversion code.
- File contains Routines for the Imaging Engine Shape Parts Drones.
-
- Version: Technology: Quickdraw GX 1.1.x
-
- Copyright: © 1991-1997 by Apple Computer, Inc., all rights reserved.
- */
-
- #include "GXToPSBuildConfig.h"
- #include "GXToPostScript.h"
- #include "RDUtil.h"
- #include "PublicPostScriptIE.h"
- #include "private.h"
- #include "PSIEResources.h"
- #include <GXGraphics.h>
-
- #ifdef resumeLabel
- #undef resumeLabel
- #endif
- #define resumeLabel(exception)
-
-
-
- //<FF>
- /************************************
- StyleDrone:
-
- Convert the gx graphics style into PostScript
- or output PostScript synonym on the style.
-
- hIEGlobals: the Imaging Engine globals
- theStyle: The style to translate.
- theShape: The shape it came from.
- makeDict: true if client wants a style dictionary, false for immediate output
-
- *************************************/
- OSErr _StyleDrone(TIEGlobalsHdl hIEGlobals, gxStyle theStyle)
- {
- OSErr status = noErr;
- long nSyn, i;
- gxTag psSynonym;
- TIEGlobalsPtr pGlobals;
-
- pGlobals = *hIEGlobals;
- pGlobals->ieStateFlags |= eSimpleStyle; // Initialize simple style to true, updated by style primitives.
-
- nSyn = GXGetStyleTags(theStyle, gxPostScriptTag, 1, gxSelectToEnd, nil);
-
- if (nSyn > 0) {
-
- nrequire(status = RDFlushBuffer(pGlobals->rdMap), failed_Style); /* OutputTag calls buffer data message dirctly */
- nrequire(status = EndProcSetDict(pGlobals->pRDParams), failed_Style);
-
- for (i = 1; i <= nSyn; ++i) {
-
- GXGetStyleTags(theStyle, gxPostScriptTag, i, 1, &psSynonym);
- nrequire(status = OutputTag(hIEGlobals, psSynonym), failed_Style);
-
- }//end for
-
- pGlobals = *hIEGlobals;
- pGlobals->ieStateFlags |= (eStyleOutOfDate | eFontOutOfDate);
-
- nrequire(status = BeginProcSetDict(pGlobals->pRDParams), failed_Style);
-
- } else {
-
- status = MiscStylePrimitive(hIEGlobals, theStyle);
- nrequire(status, failed_Style);
-
- status = FrameStylePrimitive(hIEGlobals, theStyle);
- nrequire(status, failed_Style);
-
- (*hIEGlobals)->ieStateFlags &= ~eStyleOutOfDate;
-
- }//end if
-
-
- failed_Style:
- return(status);
-
- }//StyleDrone
-
-
-
-
- //<FF>
- /************************************
- TransformDrone:
-
- Convert the gx graphics transform into PostScript
- or use PostScript synonym on the transform.
-
- hIEGlobals: the Imaging Engine globals
- theTransform: The transform to translate.
-
- *************************************/
- OSErr _TransformDrone(TIEGlobalsHdl hIEGlobals, gxTransform theTransform)
- {
- OSErr status = noErr;
- gxMapping theMapping;
- gxShape theClip;
- TRDParams* pRDParams;
- TIEGlobalsPtr pGlobals;
- TGstate* pCurrGstate;
- gxTransform currTransform;
- gxShapeType clipType;
- gxShapeFill clipFill;
- Boolean clippedIt = false;
- long nSyn, i;
- gxTag psSynonym;
- long clipPoints;
-
- pGlobals = *hIEGlobals;
- pRDParams = pGlobals->pRDParams;
-
- /** Update current graphics state with new transform **/
-
- pCurrGstate = &(pGlobals->gStateNest[pGlobals->gStateDepth]);
- currTransform = pCurrGstate->theTransform;
- pCurrGstate->theTransform = GXCloneTransform(theTransform);
- GXDisposeTransform(currTransform);
-
-
- /**** Output the transform - either from synonym or actual object data *****/
-
- nSyn = GXGetTransformTags(theTransform, gxPostScriptTag, 1, gxSelectToEnd, nil);
-
- if (nSyn > 0) {
-
- nrequire(status = EndProcSetDict(pRDParams), failed_Transform);
- nrequire(status = RDFlushBuffer(pRDParams->rdMap), failed_Transform); /* OutputTag calls buffer data message dirctly */
-
- for (i = 1; i <= nSyn; ++i) {
-
- GXGetTransformTags(theTransform, gxPostScriptTag, i, 1, &psSynonym);
- nrequire(status = OutputTag(hIEGlobals, psSynonym), failed_Transform);
-
- }//end for
-
- (*hIEGlobals)->ieStateFlags |= eTransformOutOfDate;
-
- nrequire(status = BeginProcSetDict(pRDParams), failed_Transform);
-
- } else {
-
- GXGetTransformMapping(theTransform, &theMapping);
-
- theClip = GXGetTransformClip(theTransform);
-
- require_action(theClip, failed_GetClip, status = GXGetGraphicsError(nil););
-
- clipType = GXGetShapeType(theClip);
- clipFill = GXGetShapeFill(theClip);
-
- status = PSCountShapePoints(theClip, 0, &clipPoints);
- nrequire(status, failed_CountClipPoints);
-
- pGlobals = *hIEGlobals; // Deref handle in case mem moved.
-
- /** Update current graphics state with points available after clip **/
-
- pCurrGstate = &(pGlobals->gStateNest[pGlobals->gStateDepth]);
- pCurrGstate->pointsAvail -= clipPoints;
-
- /** Concatonate CTM with the mapping **/
-
- if (!TestMappingIdentity(&theMapping)) {
-
- status = MappingPrimitive(hIEGlobals, &theMapping);
- nrequire(status, failed_Output);
-
- }//end if
-
-
- /***** Now do set the clip *****/
-
- /*****
- Don't do anything for wide-open clips:
- This means full shape non-inverse filled
- *****/
- if ( (clipType != gxFullType) || (clipFill == gxInverseFill) || (clipFill == gxInverseWindingFill) ) {
-
- status = _GeometryDrone(hIEGlobals, theClip, eClipGeometry, nil, 0);
- nrequire(status, failed_Geometry);
-
- if ( (clipType == gxRectangleType) ) { // See if we can use RectClip
-
- if ((clipFill == gxEvenOddFill) || (clipFill == gxWindingFill)) {
-
- pRDParams->resIndex = kRectClip;
- clippedIt = true;
-
- } else {
-
- pRDParams->resIndex = kRectPath;
-
- }//end if
-
- status = RDResPrintf(pRDParams);
- nrequire(status, failed_Output);
-
- }//end if
-
- /** If it isn't already the clip (cause of rectclip or fullshapes) then make the path the clip **/
-
- if (!clippedIt) {
-
- status = DoFillKey(pRDParams, clipFill);
- nrequire(status, failed_Output);
-
- pRDParams->resIndex = kQD2Clip;
- status = RDResPrintf(pRDParams);
- nrequire(status, failed_Output);
-
- }//end if
-
- }//end if
-
- (*hIEGlobals)->ieStateFlags &= ~eTransformOutOfDate;
-
- failed_Geometry:
- failed_Output:
-
- GXDisposeShape(theClip);
-
-
- }//end if
-
- failed_CountClipPoints:
- failed_GetClip:
-
- failed_Transform:
-
- return(status);
-
- }//TransformDrone
-
-
-
- //<FF>
- /************************************
- FillShapeDrone:
-
- Convert the gx graphics style into PostScript
-
- hIEGlobals: the Imaging Engine globals
- theStyle: The style to translate.
- theShape: The shape it came from.
- parents: pointer to list of parent transforms. (nil means ignore)
- depth: number of parents. (pass zero if nil passed for above)
-
- *************************************/
- OSErr _FillShapeDrone(TIEGlobalsHdl hIEGlobals, gxShape theShape, gxTransform *parents, long depth)
- {
- OSErr status;
- gxShapeType shType;
- gxShapeFill theFill;
- TRDParams *rdParams;
- TIEGlobalsPtr pIEGlobals;
- Boolean paintedIt = false;
-
- shType = GXGetShapeType(theShape);
- theFill = GXGetShapeFill(theShape);
-
- pIEGlobals = *hIEGlobals;
- rdParams = pIEGlobals->pRDParams;
-
- /**************
- If the shape's fill is one of the standard PostScript fills
- then simpleStyle can be true. This allows us to call PostScript
- Fill operators directly rathern than going through QD2Fill
- when doing immediate geometry output. Thus inverse-fill
- since inverse-fill is not a PostScript fill so we turn
- it off it was set by the StyleDrone.
- ***************/
- if (theFill == gxInverseFill)
- pIEGlobals->ieStateFlags &= ~eSimpleStyle;
-
-
- nrequire(status = _GeometryDrone(hIEGlobals, theShape, eNoGeomOptions, parents, depth), failed_Geometry);
-
- pIEGlobals = *hIEGlobals; // get it again, in case it moved.
-
-
- /*******************************************
- Rectangles can paint themselves sometimes.
- Do the right thing with the 2 rect points that the
- rectangle primitive left on the stack either way
-
- Text, layouts, glyhs, and bitmaps always paint themselves,
- Check for these cases and don't do qd2fill.
-
- *********************************************/
-
- if ( (shType == gxRectangleType) ) { // See if we can paint the rectangle.
-
- if (pIEGlobals->ieStateFlags & eSimpleStyle) {
-
- if ((theFill == gxClosedFrameFill) || (theFill == gxFrameFill))
- rdParams->resIndex = kRectStroke;
- else if ((theFill == gxEvenOddFill) || (theFill == gxWindingFill))
- rdParams->resIndex = kRectFill;
-
- status = RDResPrintf(rdParams);
- nrequire(status, failed_Output);
-
- paintedIt = true;
-
- } else {
-
- rdParams->resIndex = kRectPath;
- status = RDResPrintf(rdParams);
- nrequire(status, failed_Output);
-
- }//end if
-
- } else if ((shType == gxTextType) || (shType == gxGlyphType) || (shType == gxBitmapType) ||
- (shType == gxLayoutType) || (shType == gxEmptyType) ) {
-
- paintedIt = true;
-
- }//end if
-
- /** See if we can paint it with a standard PostScript operator **/
-
- if (!paintedIt && ((*hIEGlobals)->ieStateFlags & eSimpleStyle) ) {
-
- switch (theFill) {
-
- case gxEvenOddFill:
- rdParams->resIndex = kEofill;
- paintedIt = true;
- nrequire(status = RDResPrintf(rdParams), failed_Output);
- break;
-
- case gxWindingFill:
- rdParams->resIndex = kFill;
- paintedIt = true;
- nrequire(status = RDResPrintf(rdParams), failed_Output);
- break;
-
- case gxFrameFill:
- case gxClosedFrameFill:
- rdParams->resIndex = kStroke;
- paintedIt = true;
- nrequire(status = RDResPrintf(rdParams), failed_Output);
- break;
-
- default:
- break;
-
- }//end switch
-
- }//end if
-
- /** If it still hasn't been painted, paint it with QD2Fill **/
-
- if (!paintedIt ) {
-
- nrequire(status = DoFillKey(rdParams, theFill), failed_Output);
-
- rdParams->resIndex = kQD2Fill;
- nrequire(status = RDResPrintf(rdParams), failed_Output);
-
- }//end if
-
-
-
- failed_Output:
- failed_Geometry:
-
- return(status);
-
- }//FillShapeDrone
-
-
-
-
- //<FF>
- /**************************************
- GeometryDrone:
-
- This routine dispatches to the appropriate
- primitive drone based upon the shape type.
- It is also responsible for the encapsulation
- of a geometry in a procedure definition. See
- ERS for more information.
-
- hIEGlobals: The imaging engine globals.
- theShape: The shape to translate.
- geomOptions: the options for the geometry drone. (controls procedure definition)
- parents: pointer to the list of parent transforms (nil means no parents);
- depth: number of parents.
-
- ****************************************/
- OSErr _GeometryDrone(TIEGlobalsHdl hIEGlobals, gxShape theShape, TgeometryOptions geomOptions, gxTransform *parents, long depth)
- {
- OSErr status;
- TRDParams* pRDParams;
- gxShapeType shType;
- gxShapeFill shFill;
- Boolean rasterizeText = false;
-
- shType = GXGetShapeType(theShape);
- shFill = GXGetShapeFill(theShape);
-
- pRDParams = (*hIEGlobals)->pRDParams;
-
- /*******
- If it is a text or glyph shape, then resolve the fonts
- *******/
- if ((shType == gxTextType) || (shType == gxGlyphType) || (shType == gxLayoutType)) {
-
- status = RDFlushBuffer((*hIEGlobals)->rdMap); // Font handler can send messages so flush buffer.
- nrequire(status, failed_Flush);
-
- status = FontHandlerResolveShapeFonts((*hIEGlobals)->fhContext, theShape);
- if (status == no_outline_font_found) {
- status = noErr;
- rasterizeText = true;
- }//end if
- nrequire(status, failed_Fonts);
-
- /** If the font handler told us to rasterize the text, do it. **/
-
- if (rasterizeText) {
-
- status = PSRasterizeShape(hIEGlobals, theShape, parents, depth);
- nrequire(status, failed_RasterizeShape);
-
- }//end if
-
- shType = GXGetShapeType(theShape); // Resolving fonts may have changed text to glyph
-
- }//end if
-
-
- /** Resolve inverse winding number fill **/
-
- if (shFill == gxInverseWindingFill) {
-
- GXSimplifyShape(theShape);
- shType = GXGetShapeType(theShape);
- shFill = GXGetShapeFill(theShape);
-
- }//end if
-
-
- /********************
- If we are creating a proc for the geometry,
- Begin the proc definition (the bitmap primitive
- will handle this itself, however)
- **********************/
- if ( (geomOptions & eMakeProcedure) && (shType != gxBitmapType) ) {
-
- status = DoBeginProcedure(hIEGlobals);
- nrequire(status, failed_Proc);
-
- }//end if
-
-
- /*** Call the correct shape primitive ***/
-
- switch (shType) {
-
- case gxEmptyType:
- status = EmptyShapePrimitive(hIEGlobals, theShape, geomOptions);
- break;
-
- case gxFullType:
- status = FullShapePrimitive(hIEGlobals, theShape, geomOptions);
- break;
-
- case gxRectangleType:
- status = RectanglePrimitive(hIEGlobals, theShape, geomOptions);
- break;
-
- case gxLineType:
- status = LinePrimitive(hIEGlobals, theShape, geomOptions);
- break;
-
- case gxPointType:
- status = PointPrimitive(hIEGlobals, theShape, geomOptions);
- break;
-
- case gxPolygonType:
- status = PolygonsPrimitive(hIEGlobals, theShape, geomOptions);
- break;
-
- case gxTextType:
- status = TextPrimitive(hIEGlobals, theShape, geomOptions);
- break;
-
- case gxGlyphType:
- status = GlyphPrimitive(hIEGlobals, theShape, geomOptions);
- break;
-
- case gxPathType:
- if (GXGetShapeTags(theShape, gxCubicSynonymTag, 1, 1, nil))
- status = CubicPrimitive(hIEGlobals, theShape, geomOptions);
- else
- status = PathsPrimitive(hIEGlobals, theShape, geomOptions);
- break;
-
- case gxCurveType:
- status = CurvePrimitive(hIEGlobals, theShape, geomOptions);
- break;
-
- case gxBitmapType:
- status = BitmapPrimitive(hIEGlobals, theShape, geomOptions);
- break;
-
- #if DEBUGLEVEL > 1
- default:
- status = -999;
- dprintf(notrace, "Shape type %d not yet implemented in PostScript", (long)shType);
- #endif
-
- }//end switch
-
- nrequire(status, failed_Primitive);
-
- /********************
- If we are creating a proc for the geometry,
- End the proc definition (the bitmap primitive
- will handle this itself, however)
-
- **********************/
- if ( (geomOptions & eMakeProcedure) && (shType != gxBitmapType) ) {
-
- status = DoEndProcedure(hIEGlobals);
- nrequire(status, failed_Proc);
-
- }//end if
-
- failed_Primitive:
- failed_Proc:
- failed_RasterizeShape:
- failed_Fonts:
- failed_Flush:
-
- return(status);
-
- }//GeometryDrone
-
-
- //<FF>
- /***********
-
- routine: DoTransformHiearchy:
-
- Routine makes sure that the current nested graphics
- state on the PostScript device matches the transform
- hiearchy of the current shape.
-
- hIEGLobals: imaging engine global state.
- parents: Array of parent transforms of the current shape.
- depth: Length of this array.
- theShape: Current shape to be drawn.
-
-
- Before doing anything: Deal with any perspective in the hiearchy.
- Then:
-
- Compare PostScript device's state to the parent transform list:
- Compare the parent transforms to graphics state transforms
- up to n. (The n'th in the nest is the transform of the last
- shape drawn.)
-
-
- 1. if the current printer state depth is greater than new depth (plus 1 because of shape)
- grestore back to new depth.
- 2. Compare transforms in new list to printer state.
- grestore back behind first one that is different.
- 3. output any transforms that are in the new list to
- update the printer state.
-
- ************/
- OSErr _DoTransformHiearchy(TIEGlobalsHdl hIEGlobals, gxTransform *parents, long depth, gxShape theShape)
- {
- OSErr status = noErr;
- long i, j, currDepth, newDepth;
- TIEGlobalsPtr pGlobals;
- gxTransform shapesTransform, *pTransform;
- TGstate* pGstate;
-
- shapesTransform = GXGetShapeTransform(theShape);
-
- pGlobals = *hIEGlobals; // dereference globals.
-
- /** Step 1 **/
-
- currDepth = pGlobals->gStateDepth + 1; // gStateDepth is a zero based field so add one.
- newDepth = depth + 1; // Include shape's transform in new depth.
-
- // Make sure new depth is >= printer's depth.
-
- for (i = newDepth; i < currDepth; i++) {
-
- status = _DoGrestore(hIEGlobals, false);
- nrequire(status, failed_DoGrestore);
-
- }//end for
-
- pGlobals = *hIEGlobals; // dereference globals.
- currDepth = pGlobals->gStateDepth + 1; // Get new depth after grestores, gStateDepth is a zero based field so add one.
-
- /** Step 2 **/
-
- pGstate = &(pGlobals->gStateNest[0]);
- pTransform = &(parents[0]);
- for (i = 0; i < currDepth; ++i) {
-
- if (i == (newDepth-1)) // Skanky way to pretend shape's transform is in array.
- pTransform = &shapesTransform;
-
- /** Break out of the loop when shape's transform doesn't match state's transform **/
-
- if (pGstate->theTransform != *pTransform)
- if (!PSEqualTransform(pGstate->theTransform, *pTransform))
- break;
-
- ++pGstate;
- ++pTransform;
-
- }//end for
-
- /** Grestore all transforms from i on **/
- for (j = i; j < currDepth; ++j)
- nrequire(status = _DoGrestore(hIEGlobals, false), failed_DoGrestore);
-
- /** Step 3 **/
-
- pGlobals = *hIEGlobals;
- pTransform = &(parents[i]);
- for (j = i; j < newDepth; ++j) {
-
- if ((j + 1) == newDepth )
- pTransform = &shapesTransform; // Skanky way to pretend shape's transform is in array.
-
- status = _DoGsave(hIEGlobals, false);
- nrequire(status, failed_DoGsave);
-
- status = _TransformDrone(hIEGlobals, *pTransform);
- nrequire(status, failed_Transform);
-
- #if DEBUGLEVEL > 1
-
- pGlobals = *hIEGlobals;
- {
- unsigned char pointsLeft[] = "%- points left: ";
- TRDParams* rdParams = pGlobals->pRDParams;
- nrequire(status = PSIEBufferData(hIEGlobals, pointsLeft, 16, 0), failed_Transform);
-
- pGlobals = *hIEGlobals;
-
- rdParams->resIndex = kDoInt;
- nrequire(status = RDResPrintf(rdParams, pGlobals->gStateNest[pGlobals->gStateDepth].pointsAvail), failed_Transform);
-
- }
-
- #endif
-
- ++pTransform;
-
- }//end for
-
-
- failed_Transform:
- failed_DoGsave:
- failed_DoGrestore:
-
- return(status);
-
- }//DoTransformHiearchy
-
-
-
-
- //<FF>
- /*******************************************************
- PostScriptSynonymDrone:
-
- Routine dumps the PostScript synonyms associated with a shape
-
- hIEGlobals: the globals.
- theShape: the shape with the synonym.
- nSyn: Number of PostScript synonyms.
-
- *********************************************************/
- OSErr _PostScriptSynonymDrone(TIEGlobalsHdl hIEGlobals, gxShape theShape, long nSyn)
- {
- OSErr status;
- long i, synSize;
- gxTag psSynonym, controlTag;
- gxPostControl *postControlData;
- long buffFlags;
- TRDParams *rdParams;
- long stateFlags;
- gxPoint normalTangent = {ff(1), ff(0)};
-
- buffFlags = gxNoBufferOptions;
- rdParams = (*hIEGlobals)->pRDParams;
-
- /** Get the control information, if it is there otherwise use defaults **/
-
- if (GXGetShapeTags(theShape, gxPostControlTag, 1, 1, &controlTag)) {
-
- GXLockTag(controlTag);
-
- postControlData = (gxPostControl*)((char*)GXGetTagStructure(controlTag, &synSize) - tagStructureBugOffset);
- stateFlags = postControlData->flags;
-
- /** Do a save around synonym unless app said not to or in middle of multi-shape synonym. **/
-
- if (!(stateFlags & gxNoSave) ) {
-
- rdParams->resIndex = kDoSave;
- nrequire_action(status = RDResPrintf(rdParams), failed_Output, GXUnlockTag(controlTag););
-
- /* make sure continuation ignored if noSave isn't set */
- #if DEBUGLEVEL > 0
- if (stateFlags & gxPSContinueNext)
- dprintf(notrace, "gxPSContinueNext not allowed unless gxNoSave is set");
- #endif
-
- stateFlags &= ~(long)gxPSContinueNext;
-
- }//end if
-
- /* Note, this could be simply an Else of the above clause, too scared to change it 1.1.2 */
-
- if (stateFlags & gxNoSave) { // Application is being evil, they don't want a save, so protect our state
-
- /****
- This will force updating of graphics state (in context of transform nest) next
- real gx graphics shape
- ****/
- (*hIEGlobals)->ieStateFlags |= eInitializeGstate;
-
- #ifndef GXTOPOSTSCRIPTLIBRARY
- /* This is for evil apps that use PostScript piccomments to change color (Informed Mgr) */
- if ((*hIEGlobals)->compatFlags.flags1 & kMaintainColorAcrossRestores)
- (*hIEGlobals)->ieStateFlags &= ~eColorOutOfDate;
- #endif
-
- }//end if
-
-
- GXUnlockTag(controlTag);
-
- } else {
-
- #if DEBUGLEVEL > 1
- dprintf(trace, "PS Shape had no control tag");
- #endif
-
- postControlData = nil;
- stateFlags = 0;
-
- /** If no control synonym do a save/restore around postscript **/
-
- rdParams->resIndex = kDoSave;
- nrequire(status = RDResPrintf(rdParams), failed_Output);
-
- }//end if
-
- /* If we are not already in the midst of a continuing synonym set up for synonym */
-
- if ( !( (*hIEGlobals)->ieStateFlags & ePSContinueNext ) ) {
-
- /* first, remove our dictionary from dict stack */
-
- nrequire(status = EndProcSetDict(rdParams), failed_Output);
-
- }//end if
-
-
- /* If this shape has will be followed by more for continuation, set our flag to indicate so */
-
- if ( stateFlags & gxPSContinueNext )
- (*hIEGlobals)->ieStateFlags |= ePSContinueNext;
- else
- (*hIEGlobals)->ieStateFlags &= ~ePSContinueNext;
-
-
- /** Output all of the PostScript data **/
-
- nrequire(status = RDFlushBuffer(rdParams->rdMap), failed_Flush); /* OutputTag calls buffer data message dirctly */
-
- for (i = 1; i <= nSyn; ++i) {
-
- GXGetShapeTags(theShape, gxPostScriptTag, i, 1, &psSynonym);
- nrequire(status = OutputTag(hIEGlobals, psSynonym), failed_Output);
-
- }//end for
-
-
- /* Now, put our dictionary back on dict stack if we are not in midst of continuing synonym */
-
- if ( !( (*hIEGlobals)->ieStateFlags & ePSContinueNext ) ) {
-
- nrequire(status = BeginProcSetDict(rdParams), failed_Output);
-
- }//end if
-
-
- /** Finish a save/restore around synonym unless app said not to. **/
-
- if (!(stateFlags & gxNoSave)) {
-
- rdParams->resIndex = kDoRestore;
- nrequire(status = RDResPrintf(rdParams), failed_Output);
-
- }//end if
-
-
- /* If not in the midst of continuing ps synonym, output the trailer for synonyms */
-
- if ( !( (*hIEGlobals)->ieStateFlags & ePSContinueNext ) ) {
-
- rdParams->resIndex = kEndPSSyn;
- nrequire(status = RDResPrintf(rdParams, nSyn, stateFlags), failed_Output);
-
- }//end if
-
- status = GXGetGraphicsError(nil);
- ncheck(status);
-
- failed_Fonts:
- failed_Flush:
- failed_Output:
-
- return(status);
-
- }//PostScriptSynonymDrone
-